home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / thesource-7.lha / Source / NumericalMethods.lha / NumericalMethods / atan2.c next >
Text File  |  1994-06-11  |  3KB  |  114 lines

  1. /*
  2. Path: usenet.ee.pdx.edu!cs.uoregon.edu!sgiblab!sgigate.sgi.com!olivea!decwrl!hookup!swrinde!ihnp4.ucsd.edu!usc!howland.reston.ans.net!pipex!uknet!EU.net!sun4nl!news.nic.surfnet.nl!tuegate.tue.nl!blade.stack.urc.tue.nl!jeanpaul
  3. From: jeanpaul@blade.stack.urc.tue.nl (Jean-Paul Smeets)
  4. Newsgroups: comp.graphics.algorithms
  5. Subject: Re: Fast atan2(y/x) ?
  6. Date: 11 Apr 1994 19:14:45 GMT
  7. Organization: MCGV Stack, Eindhoven University of Technology, the Netherlands.
  8. Lines: 108
  9. Message-ID: <2oc7j5$chn@tuegate.tue.nl>
  10. References: <2obpf5$8n8@hermes.louisville.edu>
  11. NNTP-Posting-Host: blade.stack.urc.tue.nl
  12.  
  13. In article <2obpf5$8n8@hermes.louisville.edu>,
  14. Joe Muller <jamull01@romulus.spd.louisville.edu> wrote:
  15. >
  16. >  With all this talk about a fast square root algorithm I was wondering
  17. >if anyone has a reasonably fast atan2 ?  I have seen some approximations 
  18. >that return values from 0 to 255 but since I am already using floating point 
  19. >I need something that returns values from -PI to PI, or 0 to 360.   
  20. >  I also need accuracy within +- 2 degrees, not -+ 5 or 10, so I was 
  21. >thinking along the lines of a power series with maybe a dozen or so iterations 
  22. I use a 10 bit fixed point atan2 in my real time code. It uses one division
  23. and a table for one quadrant. The precision can be adapted by changing the
  24. size of the lookup table.
  25.  
  26. Jean-Paul
  27. */
  28.  
  29. #define I_PI  3217
  30. #define I_PI2 1608
  31.  
  32.  
  33. static const int atan_table[] =
  34. {
  35.    0,   4,   8,  12,  16,  20,  24,  28,
  36.   32,  36,  40,  44,  48,  52,  56,  60,
  37.   64,  68,  72,  76,  80,  84,  88,  92,
  38.   96, 100, 104, 108, 112, 116, 119, 123,
  39.  127, 131, 135, 139, 143, 147, 151, 155,
  40.  159, 163, 167, 170, 174, 178, 182, 186,
  41.  190, 194, 198, 201, 205, 209, 213, 217,
  42.  221, 224, 228, 232, 236, 240, 243, 247,
  43.  251, 255, 258, 262, 266, 270, 273, 277,
  44.  281, 284, 288, 292, 296, 299, 303, 307,
  45.  310, 314, 317, 321, 325, 328, 332, 335,
  46.  339, 343, 346, 350, 353, 357, 360, 364,
  47.  367, 371, 374, 378, 381, 385, 388, 392,
  48.  395, 399, 402, 405, 409, 412, 416, 419,
  49.  422, 426, 429, 432, 436, 439, 442, 446,
  50.  449, 452, 455, 459, 462, 465, 468, 472,
  51.  475, 478, 481, 484, 487, 491, 494, 497,
  52.  500, 503, 506, 509, 512, 516, 519, 522,
  53.  525, 528, 531, 534, 537, 540, 543, 546,
  54.  549, 552, 555, 557, 560, 563, 566, 569,
  55.  572, 575, 578, 581, 583, 586, 589, 592,
  56.  595, 597, 600, 603, 606, 609, 611, 614,
  57.  617, 619, 622, 625, 628, 630, 633, 636,
  58.  638, 641, 643, 646, 649, 651, 654, 656,
  59.  659, 662, 664, 667, 669, 672, 674, 677,
  60.  679, 682, 684, 687, 689, 691, 694, 696,
  61.  699, 701, 703, 706, 708, 711, 713, 715,
  62.  718, 720, 722, 725, 727, 729, 732, 734,
  63.  736, 738, 741, 743, 745, 747, 750, 752,
  64.  754, 756, 758, 760, 763, 765, 767, 769,
  65.  771, 773, 775, 778, 780, 782, 784, 786,
  66.  788, 790, 792, 794, 796, 798, 800, 802,
  67.  804
  68. };
  69.  
  70.  
  71. /* iatan2(y, x) = 1024 * atan2(y,x) */
  72.  
  73. int iatan2(int y, int x)
  74. {
  75.     int xabs, yabs;
  76.     int f, g;
  77.  
  78.     if (x >= 0)
  79.         xabs = x;
  80.     else
  81.         xabs = -x;
  82.  
  83.     if (y >= 0)
  84.         yabs = y;
  85.     else
  86.         yabs = -y;
  87.  
  88.     if (yabs <= xabs)
  89.     {
  90.         f = (yabs * 256) / xabs;
  91.         g = atan_table[f];
  92.     }
  93.     else
  94.     {
  95.         f = (xabs * 256) / yabs;
  96.         g = I_PI_2 - atan_table[f];
  97.     }
  98.  
  99.     if (x >= 0)
  100.     {
  101.         if (y >= 0)  /* first quadrant */
  102.             return(g);
  103.         else         /* fourth quadrant */
  104.             return(-g);
  105.     }
  106.     else
  107.     {
  108.         if (y >= 0)  /* second quadrant */
  109.             return(I_PI - g);
  110.         else         /* third quadrant */
  111.             return(g - I_PI);
  112.     }
  113. }
  114.